﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Diagnostics;
using System.ServiceProcess;
using System.Threading;
using csNotificaciones;
using MotorMetricas.Entidades;
using MotorMetricas.Datos;
using MotorMetricas.Logica;
using MotorMetricas.Datos.Interfaces;
using MotorMetricas.Datos.FabricaDatos;

namespace MotorMetricas
{
    public class Motor
    {
        //Metodo main de la clase Motor que me inicia el metodo iniciador 
        static void Main(string[] args)
        {

            Motor.iniciarMotor();
        }//End de Main

        //Metodo que me llena una lista con todos los proyectos existentes
        //Devuelve una lista con todos los proyectos
        public static List<Proyecto> cargarProyectos(List<Proyecto> MisProyectos)
        {
            List<Proyecto> listaProyectos;

            IDaoAccesoProyecto DaoProyecto = FabricaDao.ObtenerFabricaDeDao(1).ObternerDaoProyecto();
            listaProyectos = DaoProyecto.ConsultarTodosProyectos(MisProyectos);

            return listaProyectos;
 
        }

        //Metodo que me carga el perfil de metrica quetenga un proyecto asociado
        //Decuelve un perfil metrica dado un proyecto
        public static PerfilMetrica cargarPerfilMetrica(Proyecto miProyecto)
        {
            PerfilMetrica perfil = new PerfilMetrica();
            IDaoAccesoMetrica metricaDao = FabricaDao.ObtenerFabricaDeDao(1).ObtenerDaoMetrica();
            perfil.MisMetricas = metricaDao.ObtenerPerfilMetricaProyecto(miProyecto);

            return perfil;
        }

        //Metodo que inicia el servicio de metricas, aqui se hace llamado a los metodos 
        //cargarPerfilMetrica y cargarProyectos
        public static void iniciarServicio(String[] argus ,Proyecto miProyecto,  String DirectorioDlls, String RutaDll, String rutaLocal)
        {
            
            ServiceController serv2 = new ServiceController("EjemploDemonioSVN");
            serv2.Stop();
            System.Threading.Thread.Sleep(15000);
            argus[0] = miProyecto.Ruta;
            serv2.Start(argus);
            System.Threading.Thread.Sleep(600000);
            
            ManejoArchivo Manejador = new ManejoArchivo();
            PerfilMetrica perfil = new PerfilMetrica();
            perfil = Motor.cargarPerfilMetrica(miProyecto);
            

            if (Manejador.ValidarRuta(DirectorioDlls))
            {
                foreach (Metrica miMetrica in perfil.MisMetricas)
                {
                    RutaDll = DirectorioDlls + miMetrica.NombreMetrica + ".dll";
                    Instanciador.Invocar(miProyecto.Id, miMetrica.IdMetrica, RutaDll, rutaLocal);

                }

            }
            else
            {
                Notificacion.mostrarVentana("Motor de Metricas", "Ruta Invalida: " + DirectorioDlls, Notificacion.Imagen.Ok, 1);

            }
        }

        //Metodo que hace llamado al levante del servicio de las metricas
        //Aqui empieza todo el proceso que hace el motor de metricas
        public static void iniciarMotor()
        {
            //esta instancia es para el grupo de configuracion
            //private ContextStaticAttribute SingletoneConfig ASCIIEncoding = SingletonConfig.ObtenerInstancia();
            //String RutaDll = ASCIIEncoding.DirectorioDll();
            string RutaDll = "";
            //string rutaLocal = @"C:\aplicaciones\Segunda Entrega\Tibet\";
            string rutaLocal = @"C:\Temp\svn\";
            string DirectorioDlls = @"C:\TempDlls\";
            int CantidadProy = 0;
            int CantidadProyActivos = 0;
            List<Proyecto> MisProyectos = new List<Proyecto>();
            
            MisProyectos = Motor.cargarProyectos(MisProyectos);
            CantidadProy = MisProyectos.Count;

            if (CantidadProy != 0)
            {
                Notificacion.mostrarVentana("Motor de Metricas", "Se inicio la generación de las métricas\nEsto puede tardar varios minutos\nPor favor espere... ", Notificacion.Imagen.Ok, 6);
                String[] argus = new String[1];

                foreach (Proyecto miProyecto in MisProyectos)
                {
                    if ((miProyecto.Status == "activo") || (miProyecto.Status == "Activo"))
                    {
                        CantidadProyActivos++;

                        Notificacion.mostrarVentana("Motor de Metricas", "Proyecto: " + miProyecto.NombreProyecto, Notificacion.Imagen.Ok, 3);

                        TimeSpan timesp = DateTime.Today.Subtract(miProyecto.Fechas[0].Fecha1);
                        int diferencia = timesp.Days;
                        //int Valor = diferencia - (2 * (diferencia / 2));
                        int Valor = diferencia % miProyecto.Dias;
                        //Valor para comprobar con miProyecto.Dias y Fecha Actual, si al proyecto debe generarse las metricas
                        if (Valor == 0)
                        {
                            Motor.iniciarServicio(argus, miProyecto, DirectorioDlls, RutaDll, rutaLocal);
                        }
                    }
                }

                ServiceController serv = new ServiceController("EjemploDemonioSVN");
                serv.Stop();
                System.Threading.Thread.Sleep(15000);
                serv.Start();


                if (CantidadProyActivos == 0)
                {
                    Notificacion.mostrarVentana("Motor de Metricas", "No existen proyectos Activos", Notificacion.Imagen.Error, 3);
                }


                Notificacion.mostrarVentana("Motor de Metricas", "Ha culminado la generación de las métricas", Notificacion.Imagen.Ok, 3);

            }
            else
            {
                Notificacion.mostrarVentana("Motor de Metricas", "No hay Proyectos disponibles", Notificacion.Imagen.Ok, 3);
            }

 
        }
    }
}
